package com.ruoyi.system.aspect;

import com.ruoyi.system.domain.vo.SearchVO;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Collection;

/**
 * 基于自定义注解的切面：仅处理标记了@ClearUpdateInfo的方法
 */
@Aspect
@Component
public class ClearUpdateInfoAspect {


    /**
     * 切入点：仅拦截标记了@ClearUpdateInfo注解的方法
     */
    @Pointcut("@annotation(com.ruoyi.system.aspect.ClearUpdateInfo)") // 替换为你的注解全类名
    public void clearUpdateInfoPointcut() {}


    /**
     * 前置通知：在目标方法执行前，处理参数中的SearchVO子类实例
     */
    @Before("clearUpdateInfoPointcut()")
    public void beforeMethod(JoinPoint joinPoint) {
        // 获取方法所有参数
        Object[] args = joinPoint.getArgs();
        if (args == null || args.length == 0) {
            return;
        }

        // 遍历参数，处理所有SearchVO子类实例（包括集合中的元素）
        for (Object arg : args) {
            processObject(arg);
        }


    }

    /**
     * 递归处理对象：
     * - 若为SearchVO子类，清除更新字段
     * - 若为集合/数组，遍历内部元素处理
     */
    private void processObject(Object obj) {
        if (obj == null) {
            return;
        }

        // 处理SearchVO的子类
        if (obj instanceof SearchVO) {
            SearchVO vo = (SearchVO) obj;
            vo.setUpdateDate(null);
            vo.setUpdateBy(null);
            vo.setUpdateById(null);
        }

        // 处理集合（如List、Set）
        else if (obj instanceof Collection) {
            Collection<?> collection = (Collection<?>) obj;
            for (Object item : collection) {
                processObject(item); // 递归处理集合元素
            }
        }
        // 处理数组（可选，根据业务需求）
        else if (obj.getClass().isArray()) {
            Object[] array = (Object[]) obj;
            for (Object item : array) {
                processObject(item);
            }
        }


    }

}
